#pragma once
// -------------------------------------------------
// BlinKit - BlinKit Library
// -------------------------------------------------
//   File Name: qjs_bindings.h
// Description: Bindings for QuickJS
//      Author: Ziming Li
//     Created: 2022-03-04
// -------------------------------------------------
// Copyright (C) 2022 MingYang Software Technology.
// -------------------------------------------------

#ifndef BLINKIT_QJS_BINDINGS_H
#define BLINKIT_QJS_BINDINGS_H

#include "third_party/quickjs/quickjs.h"

namespace blink {
class EventTarget;
#ifdef BLINKIT_UI_ENABLED
class PagePopupController;
#endif
}

namespace BlinKit {
namespace qjs {

namespace Strings {
extern const char AddEventListener[];
extern const char Data[];
extern const char Disabled[];
extern const char DispatchEvent[];
extern const char ElementFromPoint[];
extern const char Item[];
extern const char Length[];
extern const char Name[];
extern const char RemoveEventListener[];
extern const char Select[];
extern const char Size[];
extern const char StyleSheets[];
extern const char Type[];
extern const char Value[];
}

void AddConsole(JSContext *ctx, JSValue global);
void AddXMLHttpRequest(JSContext *ctx, JSValue global);
void AddBase64(JSContext *ctx, JSValue global);

JSValue CreateEventTargetPrototype(JSContext *ctx);
JSValue AddEventListenerImpl(JSContext *ctx, EventTarget *eventTarget, int argc, JSValueConst *argv);
JSValue DispatchEventImpl(JSContext *ctx, EventTarget *eventTarget, int argc, JSValueConst *argv);
JSValue RemoveEventListenerImpl(JSContext *ctx, EventTarget *eventTarget, int argc, JSValueConst *argv);

JSValue CreateContainerNodePrototype(JSContext *ctx, JSValue nodePrototype);
JSValue CreateCharacterDataPrototype(JSContext *ctx, JSValue nodePrototype);
JSValue CreateDocumentFragmentPrototype(JSContext *ctx, JSValue containerNodePrototype);
JSValue CreateCommentPrototype(JSContext *ctx, JSValue characterDataPrototype);
JSValue CreateTextPrototype(JSContext *ctx, JSValue characterDataPrototype);

JSValue CreateEventPrototype(JSContext *ctx);

JSValue CreateDOMTokenListPrototype(JSContext *ctx);
JSValue CreateHTMLCollectionPrototype(JSContext *ctx);
JSValue CreateNodeListPrototype(JSContext *ctx);

#ifdef BLINKIT_CRAWLER_ENABLED
JSValue CreateWindowPrototypeForCrawler(JSContext *ctx);

JSValue CreateNodePrototypeForCrawler(JSContext *ctx, JSValue eventTargetPrototype);
JSValue CreateDocumentPrototypeForCrawler(JSContext *ctx, JSValue containerNodePrototype);
JSValue CreateElementPrototypeForCrawler(JSContext *ctx, JSValue containerNodePrototype);

JSValue CreateLocationPrototypeForCrawler(JSContext *ctx);
JSValue CreateNavigatorPrototypeForCrawler(JSContext *ctx);
#endif

#ifdef BLINKIT_UI_ENABLED
JSValue CreateWindowPrototypeForUI(JSContext *ctx);

JSValue CreateNodePrototypeForUI(JSContext *ctx, JSValue eventTargetPrototype);
JSValue CreateDocumentPrototypeForUI(JSContext *ctx, JSValue containerNodePrototype);
JSValue CreateElementPrototypeForUI(JSContext *ctx, JSValue containerNodePrototype);

JSValue CreateButtonElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateFormElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateInputElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateOptionElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateProgressElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateSelectElementPrototype(JSContext *ctx, JSValue elementPrototype);
JSValue CreateTextAreaElementPrototype(JSContext *ctx, JSValue elementPrototype);

JSValue CreateCustomEventPrototype(JSContext *ctx, JSValue eventPrototype);
JSValue CreateMessageEventPrototype(JSContext *ctx, JSValue eventPrototype);
JSValue CreateUIEventPrototype(JSContext *ctx, JSValue eventPrototype);
JSValue CreateFocusEventPrototype(JSContext *ctx, JSValue uiEventPrototype);
JSValue CreateKeyboardEventPrototype(JSContext *ctx, JSValue uiEventPrototype);
JSValue CreateMouseEventPrototype(JSContext *ctx, JSValue uiEventPrototype);

JSValue CreateLocationPrototypeForUI(JSContext *ctx);
JSValue CreateNavigatorPrototypeForUI(JSContext *ctx);

JSValue CreateClientRectPrototype(JSContext *ctx);
JSValue CreateCSSStyleDeclarationPrototype(JSContext *ctx);
JSValue CreateScreenPrototype(JSContext *ctx);
JSValue CreateShadowRootPrototype(JSContext *ctx, JSValue documentFragmentPrototype);
JSValue CreateStyleSheetListPrototype(JSContext *ctx);

void SetPagePopupControllerProperties(JSContext *ctx, JSValue obj);
#endif

} // namespace qjs
} // namespace BlinKit

#endif // BLINKIT_QJS_BINDINGS_H
